TODO

## Important

TYPE SYSTEM REFACTOR: (test/ref/ref.km)
- no subtyping (thus no variance)
- lift record type def to the same level as enum type def
- no tuple; type Lambda2[Input1,Input2,Output]
- no unit; type Lambda0[Output]
- type Pair[A,B] record { first: A, second: B }
- update vd go-struct related code (including EnumDummyInterfaceMethod)
- implicit contexts integrated in arguments (thus have default values)
type Unknown native
type Bool union { const No, Yes }  // no as zero
type Maybe[T] union { T, None }
type None record {}
const None None { new None() }
return()  // aka return(None)
type Source[T] restricted Observable[T] // Observable no exception parameter
'a'.[Maybe[String]]  // implicit conversion
value.[Interface]  // implicit conversion
computed.[]  // unbox
type Number restricted Integer
new Number(1)  // only available in the module of Number
new Record { ... }

|-+ project
  |-+ module1
  | |-- @manifest.vd
  | |-- foo.km
  |
  |-+ module2
    |-- bar.km
    |-- baz.km

type #XXX -> type XXX data {record,union}

overload: input expr "shape" signature matching

field/case refs to list (xx.(&(branch) => ...))

repl gui (text browser + line edit, tab completion)
    - QTextBrowser < QTextEdit::append
    - display details of large objects in another window
    - consider full debugger (multiple tabs, console + timeline + source + gui)
    - debugger (in machine), debugger server, debugger client
    - reflect::Type, (param T -> Unknown)
    - reflect::Value (implicit cast from T to reflect::Value[T])
    - debug::Log('state', state)

encode, decode, decode*: async version

component function (can have preview)

SQLite (QSqlDatabase) project source storage (exclusive conn, diff the whole db)

module < project

UUID for each type/const/operator

project: kvdb (-> gist)
    content: modules(types,operators), entry point, dependencies, assets, docs

ui::modal-get-text, ui::TextViewMultiLine, ui::TextInputMultiLine

`interact-with-window` add option `min-size`; `popup` add option `rel-pos`

context menu (QMenu.exec)

var wait = make(chan struct{})  // encapsulate to something in util

qtbinding C side int vs. go side int (not the same type, fix it)

api functions for file dialogs, font dialog, ...

merge go118 branch after go1.18 released

- {prefix,infix,suffix,continuation} operator
    prefix (op foo)
    infix (op infix foo)
    suffix (op method Type.foo)
    continuation (op control foo)
    (op const)
    (op variadic)
    (op component)
    (op message)

## IDE Roadmap / Design

CS: code structures

code {
    textual: code --parse--> CST --transform--> AST --adapt--> CS
    structural: CS
}

file {
    textual: state-quo, independent loading mechanics, mods pub/pri convention
    structural: 1 file, .kmpkg
}

module can be configured as 'no module prefix' (mod:: not displayed in IDE)

- Browser-like navigation (statement <=> page) (back, forward, recent history)

- Tags for functions/types (tags instead of classes/folders)

- language-based debug-log (we can know the type)

- sample input (to get a clear preview of the dataflow)


## Refinement

- Code: dummy interface: consider { impl(Interface) } instead of { Interface() }

- Code: AST node renaming

- API: consider renaming wait and tick

- API: revise resource management for files
    consider Disposable[T] (ctx-based disposal or persist closable object)


